/**
 * @file ssid_manager.h
 * @brief Wi-Fi SSID管理器头文件
 * 
 * 该文件定义了SSID管理器类，用于管理多个Wi-Fi网络的SSID和密码。
 * 支持保存、删除、设置默认网络等功能，数据持久化存储在NVS中。
 * 
 * @author SiaZhang
 * @version 2.4.2
 */

#ifndef SSID_MANAGER_H
#define SSID_MANAGER_H

#include <string>
#include <vector>

/**
 * @brief SSID项目结构体
 * 
 * 存储单个Wi-Fi网络的SSID和密码信息
 */
struct SsidItem {
    std::string ssid;       ///< Wi-Fi网络名称
    std::string password;   ///< Wi-Fi网络密码
};

/**
 * @brief SSID管理器类
 * 
 * 使用单例模式实现的Wi-Fi网络管理器，负责：
 * - 管理多个Wi-Fi网络配置（最多10个）
 * - 数据持久化存储到NVS闪存
 * - 提供增删改查等操作接口
 * - 支持设置默认网络优先级
 */
class SsidManager {
public:
    /**
     * @brief 获取单例实例
     * @return SsidManager& 单例对象引用
     */
    static SsidManager& GetInstance() {
        static SsidManager instance;
        return instance;
    }

    /**
     * @brief 添加新的Wi-Fi网络
     * 
     * 如果SSID已存在则更新密码，否则添加到列表前端。
     * 如果列表已满（10个），则删除最后一个再添加新的。
     * 
     * @param ssid Wi-Fi网络名称
     * @param password Wi-Fi网络密码
     */
    void AddSsid(const std::string& ssid, const std::string& password);

    /**
     * @brief 根据索引删除Wi-Fi网络
     * @param index 要删除的网络索引（0-9）
     */
    void RemoveSsid(int index);

    /**
     * @brief 设置默认Wi-Fi网络
     * 
     * 将指定索引的网络移动到列表最前面，提高连接优先级
     * 
     * @param index 要设置为默认的网络索引
     */
    void SetDefaultSsid(int index);

    /**
     * @brief 清空所有保存的Wi-Fi网络
     */
    void Clear();

    /**
     * @brief 获取Wi-Fi网络列表
     * @return const std::vector<SsidItem>& Wi-Fi网络列表的常量引用
     */
    const std::vector<SsidItem>& GetSsidList() const { return ssid_list_; }

    /**
     * @brief 检查SSID列表是否为空
     * @return bool 如果列表为空返回true，否则返回false
     */
    bool IsEmpty() const { return ssid_list_.empty(); }

private:
    /**
     * @brief 私有构造函数（单例模式）
     * 
     * 构造时自动从NVS加载已保存的网络配置
     */
    SsidManager();

    /**
     * @brief 私有析构函数（单例模式）
     */
    ~SsidManager();

    /**
     * @brief 从NVS闪存加载Wi-Fi配置
     * 
     * 从"wifi"命名空间读取ssid/password键值对（最多10组）
     */
    void LoadFromNvs();

    /**
     * @brief 保存Wi-Fi配置到NVS闪存
     * 
     * 将当前SSID列表保存到"wifi"命名空间
     */
    void SaveToNvs();

    std::vector<SsidItem> ssid_list_;   ///< Wi-Fi网络列表
};

#endif // SSID_MANAGER_H
